[算法实现] 给个思路就行,不用具体。

来源:百度知道 编辑:UC知道 时间:2024/06/09 13:06:41
有m行n列的金币阵,0表示正面向上,1表示背面向上。
规则一步可以:
1、任意一行金币反过来。
2、任意两列交换。

要求求出一个状态到另一个状态的最小步骤。

[*刚开始学习算法,感到这题很难得说*]
请看清问题在回答!

{** 1、2楼的 **}

楼上的,他问的根本就不是这个意思,是问从一种状态通过以上两个规则转换成第二种状态的最小步骤。
这个和线性代数里学的差不多。
我想可以用穷举法。
给出各种不含重复步骤的算法,然后比较得出结果。

如果是第i行,就用一个for语句,把a[0][i]到a[m-1][i]如果是0就变成1,如果是1就变成0.
先再定义一个长度是n的数组,如果是x列和y列交换,就先把x传给你定义好的,再把y传过去,最后再把定义好的传给x
还是比较简单的

楼上的有一点点小错误

如果是想把第i行金币反过来
就用一个for语句,把a[i][0]到a[i][n-1]共n个
用if判断,如果值是0就变成1,如果值是1就变成0
就可以了

任意两列交换
例如是i和j列交换,再定义一个临时变量temp
也是用for语句
for(x=0;x<m;x++)//共m行
{temp=a[x][i];
a[x][i]=a[x][j];
a[x][j]=temp;} //这是两个数的交换你应该懂吧,加上前面的for,就
实现了两列的全部交换:)

m和n分别有多大?

个人觉得不会太大吧,用双向广搜:从初始和目标状态一起向中间状态搜,当两边前进到相同状态时就找到解了。广搜的程序不怎么好编,空间也是一个大问题。看看书吧。

BFS +位运算 把各种变化用位来标记。没一行或者一列用位了标记。
难度一般.....